import * as THREE from "three"

//Vector3 相关理解
export function vector3Fun() {
  const v1 = new THREE.Vector3(1, 2, 3);
  const v2 = new THREE.Vector3(4, 5, 6);
  const v3 = new THREE.Vector3();
  console.log("🚀 ~ Vector3Fun ~ v1:", v1)
  console.log("🚀 ~ Vector3Fun ~ v2:", v2)

  // 向量加法 另外有v1.add(v2);
  v3.addVectors(v1, v2);
  console.log("🚀 ~ addVectors ~ v3:", v3)

  // 向量减法 另外有v1.sub(v2);
  v3.subVectors(v1, v2);
  console.log("🚀 ~ subVectors ~ v3:", v3)

  //乘法（multiplyScalar）
  v1.multiplyScalar(2);
  console.log("🚀 ~ multiplyScalar ~ v1:", v1)
  //除法（divideScalar）
  v2.divideScalar(2);
  console.log("🚀 ~ divideScalar ~ v2:", v2)
  //点积（dot） 用途：判断向量方向（正：同向；负：反向；0：垂直）、计算夹角。
  const dotProduct = v1.dot(v2); // 结果是 1*4 + 2*5 + 3*6 = 32
  console.log("🚀 ~ Vector3Fun ~ dotProduct:", dotProduct)
  //叉积（cross）用途：计算法向量、判断方向关系。
  v1.cross(v2);
  console.log("🚀 ~ cross ~ v3:", v1)

  v1.normalize(); // v 现在是一个单位向量
  console.log("🚀 ~ normalize ~ v:", v1)
  //计算长度（length）
  const length = v1.length();
  console.log("🚀 ~ length ~ length:", length)
  //计算长度平方（lengthSq）
  const lengthSq = v1.lengthSq();
  console.log("🚀 ~ lengthSq ~ lengthSq:", lengthSq)
  //克隆向量（clone）
  const v4 = v1.clone();
  console.log("🚀 ~ clone ~ v4:", v4)
  //向量是否相等（equals）
  const isEqual = v1.equals(v2);
  console.log("🚀 ~ equals ~ isEqual:", isEqual)
  //计算与另一个向量的距离（distanceTo）
  const distance = v1.distanceTo(v2);
  console.log("🚀 ~ distanceTo ~ distance:", distance)
  //计算与另一个向量的距离平方（distanceToSquared）
  const distanceSq = v1.distanceToSquared(v2);
  console.log("🚀 ~ distanceToSquared ~ distanceSq:", distanceSq)
  //向量与另一个向量的最小值（min）
  v1.min(v2);
  console.log("🚀 ~ min ~ v1:", v1)
  //向量与另一个向量的最大值（max）
  v1.max(v2);
}
//基础变换操作
export function basicTransformFun(box: { rotateOnAxis: (arg0: THREE.Vector3, arg1: number) => void; }) {
  const axis = new THREE.Vector3(0,0,1).normalize();
  box.rotateOnAxis(axis, Math.PI/6); // 绕(1,1,0)轴旋转30度
  // Three.js默认旋转顺序：YXZ，即先绕Y轴旋转，再绕X轴旋转，最后绕Z轴旋转。
  // cube.rotation.order = 'ZYX'; // 使用ZYX顺序避免万向节锁
}
//欧拉角与万向节锁
export function eulerFun(box: { quaternion: { copy: (arg0: THREE.Quaternion) => void; }; }) {
  const quaternion = new THREE.Quaternion();
  quaternion.setFromEuler(new THREE.Euler(0, 0, Math.PI/4, 'XYZ'));// 万向节锁问题

  //quaternion.setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI/4);// 从轴角创建四元数
  box.quaternion.copy(quaternion);
}
//四元数：高级旋转表示
export function quaternionFun(box: { quaternion: { copy: (arg0: THREE.Quaternion) => void; }; }) {
  const axis = new THREE.Vector3(0,0,1).normalize();
// 球面插值(Slerp)
  const startQuat = new THREE.Quaternion();
  const endQuat = new THREE.Quaternion().setFromAxisAngle(axis, Math.PI/2);

  const currentQuat = new THREE.Quaternion();
  currentQuat.slerpQuaternions(startQuat, endQuat, 0.5); // 50%插值

  // 应用旋转
  box.quaternion.copy(currentQuat);
}
//矩阵变换：底层原理
export function matrixFun(box: { applyMatrix4: (arg0: THREE.Matrix4) => void; }) {
  const matrix = new THREE.Matrix4(); // 矩阵变换
  //矩阵分解
  const position = new THREE.Vector3();
  const quaternion = new THREE.Quaternion();
  const scale = new THREE.Vector3();
  matrix.decompose(position, quaternion, scale);

  // 构建变换矩阵
  matrix.compose(
    new THREE.Vector3(0, 1, 1), // 位置
    new THREE.Quaternion(),     // 旋转
    new THREE.Vector3(1, 1, 1)  // 缩放
  );
  box.applyMatrix4(matrix); // 应用变换



  //模型视图矩阵

}
